It is often desirable to have two or more computer applications simultaneously working on a single task. Computer systems which allow more than one application to work on a single task are known as distributed computer systems. When more than one application is working on a task, a mechanism must be provided through which all of the applications working on the task can communicate with each other to coordinate the processing of the task.
According to one method for coordinating the responsibilities associated with performing a task, certain applications ("client applications") are allowed to delegate certain portions of the tasks which they are executing to other applications ("server applications"). According to this strategy, a client application transmits a signal to the server application indicating an operation of the task for the server to execute. The signal also includes any data the server application may require to perform the indicated operation. Once the server application has performed the operation, the server application transmits a signal back to the client application to inform the client application that the operation has been completed. The signal also includes any data generated by the performance of the operation.
Recently, object-oriented distributed systems have been developed. In object-oriented systems, information is represented in objects which include data structures and methods. The methods define operations which may be performed on the data structures. In an object-oriented distributed system, a client application delegates operations to server applications by invoking methods defined in objects supported by the server. When a client application invokes a method on a server application, the client application must communicate to the server application exactly which method it wants to invoke. Typically, a client application communicates this information by sending the server application a method identifier which identifies the method it desires to invoke. However, under certain circumstances, a server application may support more than one method having the same method identifier. Identifiers which correspond to more than one operation are referred to herein as ambiguous identifiers. When the server application receives an ambiguous method identifier, it does not know which of the methods to perform.
The problem of ambiguous method identifiers arises when a server object inherits methods from two or more pre-existing objects. This situation is generally referred to as multiple inheritance. For example, two separate programmers may define two separate interface objects, an interface A object and an interface B object. Each programmer independently allocates the method identifiers for the methods defined in his respective interface object. It is possible that they both use the same method identifier, for example, method identifier X, for one of their methods. For example, method identifier X may identify the "load" method in the interface A object, and the "store" method in the interface B object.
If someone implements an interface C object that inherits from both the interface A object and the interface B object, the method identifier X will identify both the "load" and the "store" method in the interface C object. Further, client applications which desire to invoke either the "load" or the "store" method of the interface C object may not even be aware that there is an ambiguity. Because of inheritance, some client applications of the interface C object may only perceive the interface C object as the interface A object, whereas other client applications of the interface C object may only perceive the interface C object as the interface B object. Consequently, it cannot be assumed that client applications will even be aware that there is an ambiguity problem with respect to an identifier of a method which they desire to invoke.
One way to minimize the potential for such method identifier collisions is to adopt a scheme which employs relatively long method identifiers. For example, if 16 byte method identifiers are used instead of 4 byte method identifiers, the possibility of ambiguous method identifiers is reduced. The possibility of ambiguous identifiers may be further minimized if programmers universally adopt certain method identifier selection rules of thumb.
Unfortunately, the performance of a computer system decreases with the size of the identifiers which must be passed between client and server applications. Conversely, performance may be increased by reducing the size of the method identifiers. Specifically, the smaller the method identifier, the less data that must be transmitted from the client to the server. In addition, when the server application decodes an incoming request, it must map the method identifier contained in the request to a specific method in the server application. This mapping process is much more efficient with shorter method identifiers.
As is evident by the foregoing, it is clearly desirable to provide an object-oriented distributed system in which client applications may invoke methods on objects belonging to server applications. It is further desirable to provide an object-oriented distributed system which allows programmers to allocate relatively short method identifiers to their methods. Since the use of relatively short method identifiers increases the possibility of method identifier collisions, it is clearly desirable to provide a mechanism for resolving conflicts caused by ambiguous short method identifiers.